package com.dataSructure.list.linked.singlinked;

public class LinkedList {

    public LinkedNode head = new LinkedNode(0,"");

    //返回头节点
    public LinkedNode getHead() {
        return head;
    }

    //1. 找到当前链表的最后节点
    //2. 将最后这个节点的next 指向 新的节点
    public void add(LinkedNode linkedNode) {

        //因为head节点不能动，因此我们需要一个辅助遍历 temp
        LinkedNode temp = head;
        //遍历链表，找到最后
        while(true) {
            //找到链表的最后
            if(temp.next == null) {
                break;
            }
            //如果没有找到最后, 将将temp后移
            temp = temp.next;
        }
        //当退出while循环时，temp就指向了链表的最后
        //将最后这个节点的next 指向 新的节点
        temp.next = linkedNode;
    }

    public void addOrder(LinkedNode linkedNode){

        LinkedNode temp = head;
        boolean flag = false; // flag标志添加的编号是否存在，默认为false
        while (true){

            if(temp.next == null)break;

            if(temp.next.no >linkedNode.no){  //位置找到，就在temp的后面插入

                break;
            }else if (temp.next.no == linkedNode.no) {//说明希望添加的heroNode的编号已然存在

                flag = true; //说明编号存在
                break;
            }
            temp = temp.next; //后移，遍历当前链表
        }

        if (flag){
            System.out.printf("存在");
        }else{
            //插入到链表中, temp的后面
            linkedNode.next = temp.next;
            temp.next = linkedNode;
        }
    }

    //显示链表[遍历]
    public void list() {
        //判断链表是否为空
        if(head.next == null) {
            System.out.println("链表为空");
            return;
        }
        //因为头节点，不能动，因此我们需要一个辅助变量来遍历
        LinkedNode temp = head.next;
        while(true) {
            //判断是否到链表最后
            if(temp == null) {
                break;
            }
            //输出节点的信息
            System.out.println(temp);
            //将temp后移， 一定小心
            temp = temp.next;
        }
    }

    public void update(LinkedNode linkedNode){

        LinkedNode temp = head;
        boolean flag = false; // flag标志添加的编号是否存在，默认为false
        while (true){

            if(temp.next == null)break;

            if(temp.next.no ==linkedNode.no){  //位置找到，就在temp的后面插入

                flag = true; //说明编号存在
                break;
            }
            temp = temp.next; //后移，遍历当前链表
        }

        if (flag){
            temp.name = linkedNode.name;
        }
    }

    public void del(LinkedNode linkedNode){

        LinkedNode temp = head;
        boolean flag = false; // flag标志添加的编号是否存在，默认为false
        while (true){

            if(temp.next == null)break;

            if(temp.next.no == linkedNode.no){  //位置找到

                flag = true; //说明编号存在
                break;
            }
            temp = temp.next; //后移，遍历当前链表
        }

        if (flag) {
            temp.next = linkedNode.next;
        }

    }


}
